vlwkaos' digital garden

Rust - module systems

mod sausage_factory {
    pub fn make_sausage() {
        println!("sausage!");
    }
}

모듈 경로를 참조하는 두가지 방법

  • crate 로 시작하는 절대경로.
  • self, super 로 지정하는 상대 경로
  • The Module System

use를 사용하여 스코프를 지정해줄 수 있다. 그러면 매번 스코프를 앞에 붙이지 않아도 된다.

// An attribute to hide warnings for unused code.
#![allow(dead_code)]

enum Status {
    Rich,
    Poor,
}

enum Work {
    Civilian,
    Soldier,
}

fn main() {
    // Explicitly `use` each name so they are available without
    // manual scoping.
    use crate::Status::{Poor, Rich};
    // Automatically `use` each name inside `Work`.
    use crate::Work::*;

    // Equivalent to `Status::Poor`.
    let status = Poor;
    // Equivalent to `Work::Civilian`.
    let work = Civilian;

    match status {
        // Note the lack of scoping because of the explicit `use` above.
        Rich => println!("The rich have lots of money!"),
        Poor => println!("The poor have no money..."),
    }

    match work {
        // Note again the lack of scoping.
        Civilian => println!("Civilians work!"),
        Soldier  => println!("Soldiers fight!"),
    }
}

예시

모듈은 같은 경로의 파일이거나 mod.rs 파일이 포함된 폴더를 지칭한다.

// main.rs
mod lib;
mod update;

다음과 같은 하위 디렉토리로 모듈을 구성한다고 할 때

src/
ㄴlibs/
  ㄴmod.rs
  ㄴgame.rs
  ㄴui.rs
ㄴmain.rs

libs/mod.rs 는 다음처럼 구성이 가능하다

// libs/mod.rs
// pub은 외부 참조하는 경우
pub mod game;
pub mod ui;

같은 경로 내에서 참조하는 경우 super:: , self:: 등의 상대경로를 지칭하는 syntax를 사용한다.

예를 들어 game.rs 에서 ui.rs를 참조하는 경우 다음처럼 작성 가능하다.

// game.rs
use super::ui::*;

prelude 개념 이용하기

WIP

Referred in

Rust - module systems